/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.common.OracleHelper;
import co.gov.medellin.sdep.sisdep.common.enums.CarneStatusEnum;
import co.gov.medellin.sdep.sisdep.model.Carne;
import co.gov.medellin.sdep.sisdep.regulacion.service.ICarneService;


/**
 * <p>
 * Clase controladora que permite realizar el proceso de gestion de Carnees.
 * Permite al usuario realizar operaciones de consulta, impresion y actualizacion de registros.
 * </p>
 * <p>
 * Copyright (c) 2012<BR>
 * Consult-Soft S.A.<BR>
 * Created on: Apr 05, 2012<BR>
 * 
 * @author atabares
 * </p>
 */
public class CarneController extends BaseController implements Serializable {

	/** Generated serial version. */
	private static final long serialVersionUID = -3285110767384990403L;

	/** Bean para el manejo del formulario de busqueda Carne. */
	private Carne carneSearch = new Carne();

	/** Objeto contenedor del listado de Carne luego de una consulta. */
	private transient DataModel carneListModel;
	
	/** Bean para el manejo del formulario de creacion/edicion de Carne. */
	private Carne carne = new Carne();

	/** Instancia de servicio carneService */
	private ICarneService carneService;

	/** Identificador de Carne seleccionado para entrega. */
	public String selectedCarneId;
	

	/** Constructor por defecto, inicializa los elemento basicos del Controlador. */
	public CarneController() {
		this.carneListModel = new ListDataModel();
	}

	/**
	 * Obtiene el parametro carneSearch.
	 * @see CarneController#carneSearch
	 *
	 * @return El parametro carneSearch.
	 */
	public Carne getCarneSearch() {
		return carneSearch;
	}

	/**
	 * Asigna el parametro carneSearch.
	 * @see CarneController#carneSearch
	 *
	 * @param carneSearch valor a asignar al parametro carneSearch.
	 */
	public void setCarneSearch(Carne carneSearch) {
		this.carneSearch = carneSearch;
	}

	/**
	 * Obtiene el parametro carneListModel.
	 * @see CarneController#carneListModel
	 *
	 * @return El parametro carneListModel.
	 */
	public DataModel getCarneListModel() {
		return carneListModel;
	}

	/**
	 * Asigna el parametro carneListModel.
	 * @see CarneController#carneListModel
	 *
	 * @param carneListModel valor a asignar al parametro carneListModel.
	 */
	public void setCarneListModel(DataModel carneListModel) {
		this.carneListModel = carneListModel;
	}

	/**
	 * Obtiene el parametro carne.
	 * @see CarneController#carne
	 *
	 * @return El parametro carne.
	 */
	public Carne getCarne() {
		return carne;
	}

	/**
	 * Asigna el parametro carne.
	 * @see CarneController#carne
	 *
	 * @param carne valor a asignar al parametro carne.
	 */
	public void setCarne(Carne carne) {
		this.carne = carne;
	}

	/**
	 * Obtiene el parametro carneService.
	 * @see CarneController#carneService
	 *
	 * @return El parametro carneService.
	 */
	public ICarneService getCarneService() {
		return carneService;
	}

	/**
	 * Asigna el parametro carneService.
	 * @see CarneController#carneService
	 *
	 * @param carneService valor a asignar al parametro carneService.
	 */
	public void setCarneService(ICarneService carneService) {
		this.carneService = carneService;
	}

	/**
	 * Obtiene el parametro selectedCarneId.
	 * @see CarneController#selectedCarneId
	 *
	 * @return El parametro selectedCarneId.
	 */
	public String getSelectedCarneId() {
		return selectedCarneId;
	}

	/**
	 * Asigna el parametro selectedCarneId.
	 * @see CarneController#selectedCarneId
	 *
	 * @param selectedCarneId valor a asignar al parametro selectedCarneId.
	 */
	public void setSelectedCarneId(String selectedCarneId) {
		this.selectedCarneId = selectedCarneId;
	}

	
	/**
	 * Obtiene el registro del Carne asociado al documento de identidad pasado como parametro y que se 
	 * encuentra disponible para su entrega, es decir en estado "Generado".
	 * 
	 * @return La cadena que redirecciona a la pagina con el formulario de entrega de Carne.
	 */
	public String getDeliveryCarneByParameters() {
		try {
			List carneList = new ArrayList();
			carneList = getCarneService().getCarneListByCriteria(this.carneSearch);
			
			this.carneListModel.setWrappedData(carneList);
		} catch (Exception e) {
			e.printStackTrace(System.err);
			
			((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setErrorMessage(AppConstants.DEFAULT_ERROR + e.getMessage(), null, null);
		}
		
		if (this.carneListModel.getWrappedData() == null 
				|| ((List) this.carneListModel.getWrappedData()).isEmpty()) {
			
			((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setAlertMessage(AppConstants.NO_RECORDS_FOUND, null, null);
		}
		
		return AppConstants.OPTION_CARNE_DELIVERY;
	}
	
	/**
	 * Verifica que se haya seleccionado un Carne de la lista y ejecuta el proceso de entrega de Carne.
	 * 
	 * @return La cadena que redirecciona a la pagina de entrega Carne.
	 */
	public String deliveryCarneButton() {
		Map params =  getExternalContext().getRequestParameterMap();
		this.selectedCarneId = (String)params.get("idCarneSlct");

		if (!OracleHelper.isNullorEmpty(this.selectedCarneId)) {
			this.carne.setId(new Long(this.selectedCarneId));
			this.carne.setEstado(CarneStatusEnum.DELIVERED.toString());
			this.carne.setUsuarioModifica(BaseController.getLoggedUserID());
			
			getCarneService().deliveryCarne(this.carne);
			
			((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage(AppConstants.SUCCESS_UPDATE, null, null);
			
			this.getDeliveryCarneByParameters();
		} else {
			((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setAlertMessage("Debe seleccionar un Carne para la entrega.", null, null);
		}
		
		return AppConstants.OPTION_CARNE_DELIVERY;
	}
}
